﻿using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using System.Net;
using System.Net.Http;
using System.Web.Http;

namespace Flagwind.Web.Http.Controllers
{
	public class FileController : ApiController
	{
		#region 成员字段

		private WebFileAccessor _accessor;

		#endregion

		#region 构造方法

		public FileController()
		{
			_accessor = new WebFileAccessor();
		}

		#endregion

		#region 公共属性

		public string BasePath
		{
			get
			{
				return _accessor.BasePath;
			}
			set
			{
				_accessor.BasePath = value;
			}
		}

		#endregion

		#region 公共方法

		/// <summary>
		/// 下载指定路径的文件。
		/// </summary>
		/// <param name="path">指定要下载的文件的相对路径或绝对路径（绝对路径以/斜杠打头）。</param>
		public HttpResponseMessage Get(string path)
		{
			if(string.IsNullOrWhiteSpace(path))
			{
				throw new HttpResponseException(HttpStatusCode.BadRequest);
			}

			return _accessor.Read(path);
		}

		/// <summary>
		/// 获取指定文件的外部访问路径。
		/// </summary>
		/// <param name="path">指定的文件相对路径或绝对路径（绝对路径以/斜杠打头）。</param>
		/// <returns>返回指定文件的外部访问路径。</returns>
		[HttpGet]
		public string Path(string path)
		{
			if(string.IsNullOrWhiteSpace(path))
			{
				throw new HttpResponseException(HttpStatusCode.BadRequest);
			}

			return _accessor.GetUrl(path);
		}

		/// <summary>
		/// 获取指定路径的文件描述信息。
		/// </summary>
		/// <param name="path">指定要获取的文件的相对路径或绝对路径（绝对路径以/斜杠打头）。</param>
		/// <returns>返回的指定的文件详细信息。</returns>
		[HttpGet]
		public Task<Flagwind.IO.FileInfo> Info(string path)
		{
			if(string.IsNullOrWhiteSpace(path))
			{
				throw new HttpResponseException(HttpStatusCode.BadRequest);
			}

			return _accessor.GetInfo(path);
		}

		/// <summary>
		/// 删除指定相对路径的文件。
		/// </summary>
		/// <param name="path">指定要删除的文件的相对路径或绝对路径（绝对路径以/斜杠打头）。</param>
		public Task<bool> Delete(string path)
		{
			if(string.IsNullOrWhiteSpace(path))
			{
				throw new HttpResponseException(HttpStatusCode.BadRequest);
			}

			return _accessor.Delete(path);
		}

		/// <summary>
		/// 修改指定路径的文件描述信息。
		/// </summary>
		/// <param name="path">指定要修改的文件相对路径或绝对路径（绝对路径以/斜杠打头）。</param>
		public Task<bool> Put(string path)
		{
			if(string.IsNullOrWhiteSpace(path))
			{
				throw new HttpResponseException(HttpStatusCode.BadRequest);
			}

			return _accessor.SetInfo(this.Request, path);
		}

		/// <summary>
		/// 上传一个文件或多个文件。
		/// </summary>
		/// <param name="directory">指定上传文件的目录路径（绝对路径以/斜杠打头）。</param>
		/// <returns>返回上传成功的<see cref="Flagwind.IO.FileInfo"/>文件描述信息实体对象集。</returns>
		public Task<IEnumerable<Flagwind.IO.FileInfo>> Post(string directory = null)
		{
			return _accessor.Write(this.Request, directory);
		}

		#endregion
	}
}